一、通过天数叠加进行统计
使用 CONVERT(,,)方法将日期精确到日期,然后用DATEADD(,,)方法进行天数叠加
发此方法是用最简单的SQL语句进行统计,分别统计出1天内、2天内、3天内的总的数据记录,然后通过for循环进行减运算,最后得出每天的数据量。此种方法最大的弊端就是时间复杂度太高,而需要遍历n多次数据库才能的得到最终结果。
public List<int> GetCommitTotal_Personally_ByDay(string username, int queryDays)
{
List<int> list = new List<int>();
SqlConnection conn = connectLocaldb.ConnectDataBase();
//打开数据库
conn.Open();
//创建查询语句
SqlCommand querySingleInfo = conn.CreateCommand();
for (int i = 0; i < queryDays; i++)
{
querySingleInfo.CommandText = "SELECT COUNT(*) as times FROM MemberCommitBeforeCompiling where UserName=" + "'" + username + "'AND DATEADD(d,-" + i + ", CONVERT(varchar(12), getdate(), 111)) <= CONVERT(varchar(12), CommitTime, 111) ";
using (SqlDataReader reader = querySingleInfo.ExecuteReader())
{
// Loop over the results
while (reader.Read())
{
memberCommit.times = reader["times"].ToString().Trim();
num[i] = int.Parse(memberCommit.times);
}
}
}
list.Add(num[0]);
if (queryDays > 1)
{
for (int i = 1; i < queryDays; i++)
{
list.Add(num[i] - num[i - 1]);
}
}
list.Reverse();
//关闭数据库连接
conn.Close();
return list;
}`</pre>
**二、格式化数据类型,直接查询**。
**使用 CONVERT(,,)方法直接格式化精确到日期**
相比于第一种,在时间上得到了很大的优化,只需一次查询就可以得到准确数据。弊端是,如果数据库中没有该日期的数据计划,则不返回数据,所以每一次操作都需要对所得数据进行一次遍历。相对于时间上的优化,这个弊端可以忽略不计。
<pre>` public Dictionary<int,int> GetCommitByDays(string username,int querydays)
{
//以当前日作第一天,0代表今天
querydays--;
Dictionary<int, int> commitNumber = new Dictionary<int, int>();
//连接本地数据库
SqlConnection conn = connectLocaldb.ConnectDataBase();
//打开数据库
conn.Open();
//创建查询语句
SqlCommand querySingleInfo = conn.CreateCommand();
querySingleInfo.CommandText = "SELECT CONVERT(varchar(12), CommitTime, 112) as queryKey, COUNT(CONVERT(varchar(12), CommitTime, 112)) as queryValue FROM MemberCommitBeforeCompiling where UserName=" + "'" + username + "' and DATEADD(d,-"+querydays+", CONVERT(varchar(12), getdate(), 112)) <= CONVERT(varchar(12), CommitTime, 112) group by CONVERT(varchar(12), CommitTime, 112) order by CONVERT(varchar(12), CommitTime, 112)desc";
SqlDataReader singleInfoReader = querySingleInfo.ExecuteReader();
//有多行数据,用while循环
while (singleInfoReader.Read())
{
int key =int.Parse( singleInfoReader["queryKey"].ToString().Trim());
int value= int.Parse(singleInfoReader["queryValue"].ToString().Trim());
commitNumber.Add(key, value);
}
//关闭查询
singleInfoReader.Close();
//关闭数据库连接
conn.Close();
return commitNumber;
}